﻿#ifndef GRAPHICSRECTITEM_H
#define GRAPHICSRECTITEM_H

#include <QGraphicsItem>
#include "sizehandlerect.h"

class GraphicsRectItem : public QGraphicsItem
{
public:
    /*
     * @brief   初始化裁剪窗矩形。
     * @param   rect：裁剪窗矩形的形状。
     *          parent：传给父类QGraphicsItem的参数。
     * @retval  无*/
    GraphicsRectItem(const QRect & rect ,QGraphicsItem * parent);

    /*
     * @brief   重写形状函数。返回m_rect的左、上、右、下信息，同 rect()。
     * @param   无
     * @retval  矩形的x,y,宽，高*/
    QRectF boundingRect() const;

    /*
     * @brief   改变裁剪窗矩形的大小，在鼠标点击绿点后的鼠标移动事件中调用。
     *          从Scene映射点，移动QRect的边/角到输入点的位置，调用updateGeometry()
     * @param   dir：被点击绿点的位置信息。
     *          point：鼠标此时的位置信息。
     * @retval  无*/
    virtual void resizeTo(SizeHandleRect::Direction dir, const QPointF & point );

    /*
     * @brief   移动裁剪窗矩形的位置，在鼠标点击矩形后的鼠标移动事件中调用。
     * @param   point：矩形左上角的目标位置信息。
     * @retval  无*/
    void move(const QPointF & point);

    /*
     * @brief   返回对应绿点上该显示的鼠标形状。
     * @param   dir：绿点的位置信息。
     * @retval  鼠标形状*/
    virtual Qt::CursorShape getCursor(SizeHandleRect::Direction dir );

    /*
     * @brief   鼠标点击测试，返回鼠标点击到的对象
     * @param   point：鼠标此时的位置信息。
     * @retval  被点击绿点的位置信息*/
    SizeHandleRect::Direction  hitTest( const QPointF & point ) const;

    /*
     * @brief   重写形状函数。返回m_rect的左、上、右、下信息。
     * @param   无
     * @retval  矩形的x,y,宽，高*/
    virtual QRectF  rect() const;

    /*
     * @brief   将各个绿点移动到指定位置。
     *          初始化时、矩形边界移动、矩形移动时调用。
     * @param   无
     * @retval  无*/
    virtual void updateGeometry();

    QRectF m_rect;//存放裁剪窗矩形的形状。

private:

    typedef QVector<SizeHandleRect*> Handles;
    Handles m_handles;              //存放所有绿点的实例对象。
    int selection_handle_size = 4;  //绿点的size

protected:
    /*
     * @brief   重写的绘画函数，矩阵创建时由框架调用。用来决定裁剪窗矩形的色彩粗细等属性。
     * @param   不解释
     * @retval  无*/
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

    /*
     * @brief   遍历设置各个绿点的状态。
     * @param   st：绿点的状态。
     * @retval  无*/
    void setState(SelectionHandleState st);

    /*
     * @brief   重写的item更变函数，当item有改变时由框架调用。
     * @param   change：item更变信息。
     *          value：item更变信息。
     * @retval  返回更变信息*/
    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
};

#endif // GRAPHICSRECTITEM_H
